package pl.edu.pk.psb.bc.bo;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import pl.edu.pk.psb.bc.assembler.MiejsceAssembler;
import pl.edu.pk.psb.bc.assembler.UzytkownikAssembler;
import pl.edu.pk.psb.bc.assembler.WydarzenieAssembler;
import pl.edu.pk.psb.bc.dao.MiejsceDao;
import pl.edu.pk.psb.bc.dao.UzytkownikDao;
import pl.edu.pk.psb.bc.dao.WydarzenieDao;
import pl.edu.pk.psb.bc.ds.WydarzenieDs;
import pl.edu.pk.psb.bc.dto.RezerwacjaDto;
import pl.edu.pk.psb.bc.dto.UzytkownikDto;

@Component
public class UzytkownikBoImpl implements UzytkownikBo {
	@Autowired
	UzytkownikDao uzytkownikDao;
	
	@Autowired
	WydarzenieDao wydarzenieDao;
	
	@Autowired
	MiejsceDao miejsceDao;
	
	
	@Autowired
	MiejsceAssembler miejsceAssembler;

	@Autowired
	UzytkownikAssembler uzytkownikAssembler;
	
	@Autowired
	WydarzenieAssembler wydarzenieAssembler;

	@Override
	@Transactional
	public UzytkownikDto pobierzUzytkownika(Integer id) {
		return uzytkownikAssembler.konwertuj(uzytkownikDao.pobierz(id));
	}

	@Override
	@Transactional
	public UzytkownikDto zaloguj(String login, String haslo) {
		return uzytkownikAssembler.konwertuj(uzytkownikDao.zaloguj(login, haslo));
	}

	@Override
	@Transactional
	public void zarejestruj(UzytkownikDto uzytkownik) {
		uzytkownikDao.zapisz(uzytkownikAssembler.konwertuj(uzytkownik));
	}
	
	@Override
	@Transactional
	public void rezerwujMiejsca(UzytkownikDto uzytkownik, List<Integer> miejsca, Integer idWydarzenia) {
		uzytkownikDao.rezerwujMiejsca(uzytkownikAssembler.konwertuj(uzytkownik), miejsca, idWydarzenia);
	}
	
	@Override
	@Transactional
	public void rezerwujMiejsca(UzytkownikDto uzytkownik, Integer idWydarzenia, Integer ileMiejsc) {
		RezerwacjaDto rezerwacja = new RezerwacjaDto();
		rezerwacja.setData(new Date());
		rezerwacja.setIloscMiejsc(ileMiejsc);
		rezerwacja.setIdWydarzenia(idWydarzenia);
		uzytkownik.getRezerwacje().add(rezerwacja);
		WydarzenieDs wydarzenie = wydarzenieDao.pobierz(idWydarzenia);
		if(wydarzenie.getWszystkichMiejsc()<ileMiejsc){
			throw new RuntimeException("Nie mozna dokonac rezerwacji - brak miejsc");
		}
		int miejscaWolneWWydarzeniu = wydarzenie.getWszystkichMiejsc();
		wydarzenie.setDostepnychMiejsc(miejscaWolneWWydarzeniu-ileMiejsc);
		wydarzenieDao.zapisz(wydarzenie);
		uzytkownikDao.zapisz(uzytkownikAssembler.konwertuj(uzytkownik));
	}

	@Override
	@Transactional
	public List<UzytkownikDto> pobierzListeUzytkownikow() {
		return uzytkownikAssembler.konwertujDoDto(uzytkownikDao.pobierzWszystkie());
	}

}
